


//注意这个循环队列只能存放数组长度-1个元素
public class ArrayQueueSuccese {
    public int maxSize;//队列最大存储量
    public int front;//队列的头部
    public int rear;//队里的尾部
    int[]array;//数组

    public ArrayQueueSuccese(int maxSize){
        this.maxSize=maxSize;
        array=new int[maxSize];
        //front和rear的初始位置相同
        front=0;//第一个队首元素下标
        rear=0;//尾部元素的的后一个下标
    }

    //判断队列是否为空
    public boolean isEmpty(){
        //当front和rear相同时就认为是队列为空
        return front==rear;
    }

    //判断队列是否为满
    public boolean isFull(){
        //这里用到取余数的方法来将数组"循环起来"
        return (rear+1)%maxSize==front;
    }

    //插入元素
    public void insert(int key){
        //判断为满
        if(isFull()){
            throw  new RuntimeException("队列已满，无法插入元素");
        }
        array[rear]=key;
        rear=(rear+1)%maxSize;
    }

    //取出队首元素
    public int push(){
        //判断为空
        if(isEmpty()){
            throw new RuntimeException("队列为空，无法取出元素");
        }
        int head=array[front];
        front=(front+1)%maxSize;
        return head;
    }
    //取出循环队列的首元素
    public int peek(){
        //判断是否为空
        if(isEmpty()){
            throw new RuntimeException("队列为空，偷窥失败");
        }
        return array[front];
    }

}
